
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Spring学习文档 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Spring学习文档 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring框架的核心理念和设计原则是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring框架的核心理念和设计原则包括：轻量级（Lightweight）、非侵入式（Non-invasive）、松耦合（Loose Coupling）、面向接口（Interface-based）、依赖注入（Dependency Injection）、面向切面编程（Aspect-Oriented Programming）和一站式（One-Stop Shop）。</div>
          </div>
          <div class="card-source">来源: Spring框架的核心理念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring IoC容器的两个主要接口是什么？它们有何区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">主要的IoC容器接口有两个：BeanFactory和ApplicationContext。BeanFactory是Spring IoC容器的基础接口，提供基本的IoC功能。ApplicationContext是BeanFactory的子接口，提供了更多高级功能，如事件发布、国际化、文件资源读取等。</div>
          </div>
          <div class="card-source">来源: Spring IOC 思想</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Spring Bean的两种主要作用域是什么？它们之间有什么关键区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">两种主要的作用域是单例（Singleton）和原型（Prototype）。单例作用域是Spring的默认作用域，在每个Spring IoC容器中，Bean定义只对应一个单一实例。而原型作用域下，每次请求（获取Bean）都会创建一个新的Bean实例。</div>
          </div>
          <div class="card-source">来源: Bean的作用域</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">Spring框架支持哪三种主要的依赖注入（DI）实现方式？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring框架支持三种主要的依赖注入方式：1. 构造器注入，通过构造器参数传递依赖对象；2. Setter方法注入，通过Setter方法传递依赖对象；3. 字段注入，直接在字段上使用注解注入依赖对象。</div>
          </div>
          <div class="card-source">来源: DI的实现方式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">请解释Spring AOP中的核心概念：切面（Aspect）、通知（Advice）和切入点（Pointcut）。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">切面（Aspect）是将跨领域关注点封装起来的可重用模块。通知（Advice）是在特定连接点上执行的代码，例如方法执行前或后。切入点（Pointcut）是定义在哪些连接点上应用通知的表达式，用于精确选择目标方法。</div>
          </div>
          <div class="card-source">来源: AOP的核心概念</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring AOP的底层实现依赖于哪两种动态代理机制？它们分别在什么情况下被使用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring AOP的底层实现依赖于JDK动态代理和CGLIB代理。如果目标对象实现了接口，Spring AOP会使用JDK动态代理。如果目标对象没有实现任何接口，Spring AOP会使用CGLIB来生成目标对象的子类代理。</div>
          </div>
          <div class="card-source">来源: Spring AOP底层实现</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">Spring推荐的事务管理方式是什么？它与编程式事务管理有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring推崇的是声明式事务管理，它允许开发者通过注解或XML配置来定义事务边界，而无需在业务代码中直接处理事务控制逻辑。相比之下，编程式事务管理需要直接使用TransactionTemplate或PlatformTransactionManager接口进行事务控制，耦合度更高。</div>
          </div>
          <div class="card-source">来源: 2、声明式事务管理 和 3、编程式事务管理</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在Spring中，什么是饿汉式（Eager Initialization）和懒加载（Lazy Initialization）？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">饿汉式是Spring默认的bean初始化方式，即在Spring容器启动时就立即实例化所有单例bean。懒加载则将bean的实例化推迟到首次被请求时才进行，这可以通过在XML配置中使用 lazy-init="true" 属性来启用。</div>
          </div>
          <div class="card-source">来源: 饿汉式与懒汉式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">@Component, @Service, @Repository, @Controller这四个注解有什么共同点和区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">共同点是它们都用于声明一个类会作为bean被Spring容器管理。区别在于它们的语义和应用层次：@Component是通用组件；@Service用于服务层（业务逻辑）；@Repository用于数据访问层；@Controller用于表现层（MVC控制器）。@Service, @Repository, @Controller都是@Component的特化。</div>
          </div>
          <div class="card-source">来源: Spring常用注解</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
